﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ParallelGrep.Properties;

namespace ParallelGrep.Utility
{
    /// <summary>
    /// 文字列ヘルパー
    /// </summary>
    public sealed class StringHelper
    {
        private static readonly string[] Units = new string[] { "SizeB", "SizeKB", "SizeMB", "SizeGB", "SizeTB", "SizePB", "SizeEB", "SizeZB", "SizeYB" };

        #region Split
        /// <summary>
        /// 指定したコマンドをプログラム部とパラメータ部を分割します。
        /// </summary>
        /// <param name="command">コマンド</param>
        /// <returns>分割した文字列配列</returns>
        public static string[] Split(string command)
        {
            bool dq = false;
            int idx = 0;
            foreach (char c in command)
            {
                if (dq)
                {
                    if (c == '\"')
                    {
                        dq = false;
                    }
                }
                else
                {
                    if (c == '\"')
                    {
                        dq = true;
                    }
                    else if (c == ' ')
                    {
                        break;
                    }
                }
                idx++;
            }
            return new string[] { command.Substring(0, idx), command.Substring(idx) };
        }
        #endregion

        #region GetSizeUnit
        /// <summary>
        /// 指定したユニットで単位表示文字列を取得します。
        /// </summary>
        /// <param name="unit">ユニット</param>
        /// <returns>単位表示文字列</returns>
        public static string GetSizeUnit(string unit)
        {
            if (unit == "SizeB")
            {
                return ParallelGrep.Properties.Resources.SizeB;
            }
            else if (unit == "SizeKB")
            {
                return ParallelGrep.Properties.Resources.SizeKB;
            }
            else if (unit == "SizeMB")
            {
                return ParallelGrep.Properties.Resources.SizeMB;
            }
            else if (unit == "SizeGB")
            {
                return ParallelGrep.Properties.Resources.SizeGB;
            }
            else if (unit == "SizeTB")
            {
                return ParallelGrep.Properties.Resources.SizeTB;
            }
            else if (unit == "SizePB")
            {
                return ParallelGrep.Properties.Resources.SizePB;
            }
            else if (unit == "SizeEB")
            {
                return ParallelGrep.Properties.Resources.SizeEB;
            }
            else if (unit == "SizeZB")
            {
                return ParallelGrep.Properties.Resources.SizeZB;
            }
            else if (unit == "SizeYB")
            {
                return ParallelGrep.Properties.Resources.SizeYB;
            }
            else
            {
                return string.Empty;
            }
        }
        #endregion

        #region GetSizeValue
        /// <summary>
        /// 指定したサイズで、単位表示文字列を取得します。
        /// </summary>
        /// <param name="value">サイズ</param>
        /// <returns>単位表示文字列</returns>
        public static string GetSizeValue(long value)
        {
            double size = value;
            int idx = 0;
            while (size > 1024)
            {
                if (idx > Units.Length)
                {
                    break;
                }
                size = size / 1024;
                idx++;
            }
            return string.Format("{0:f1} {1}", size, GetSizeUnit(Units[idx])).Replace(".0", "");
        }
        #endregion
    }
}
